package com.lw.lwte.common.helper;

import java.util.Objects;
import java.util.regex.Pattern;

/**
 * 验证工具类
 */
public class ValidateHelper {
    private ValidateHelper() {
    }

    /**
     * 正则匹配
     *
     * @param text
     * @param regex
     */
    public static boolean matches(String text, String regex) {
        if (StringHelper.isBlank(text) || StringHelper.isBlank(regex)) {
            return false;
        }
        return Pattern.compile(regex).matcher(text).matches();
    }

    /**
     * 匹配年龄
     *
     * @param age
     */
    public static boolean isAge(int age) {
        return range(1, 200, age);
    }

    /**
     * 匹配姓名
     *
     * @param name
     */
    public static boolean isName(String name) {
        if (StringHelper.isBlank(name)) {
            return false;
        }
        int length = name.length();
        if (isChineseChar(name)) {
            return range(1, 15, length);
        } else {
            return range(1, 30, length);
        }
    }

    /**
     * 判断中文字符(包括汉字和符号)
     *
     * @param text
     */
    public static boolean isChineseChar(String text) {
        return matches(text, "^[\u0391-\uFFE5]+$");
    }

    /**
     * 匹配汉字
     *
     * @param text
     */
    public static boolean isChinese(String text) {
        return matches(text, "^[\u4e00-\u9fa5]+$");
    }

    /**
     * 判断英文字母(a-zA-Z)
     *
     * @param text
     */
    public static boolean isLetter(String text) {
        return matches(text, "^[A-Za-z]+$");
    }

    /**
     * 匹配正整数
     *
     * @param str
     */
    public static boolean isDigits(String str) {
        return matches(str, "^[0-9]*$");
    }

    /**
     * 匹配正浮点数
     *
     * @param str
     */
    public static boolean isFloat(String str) {
        return matches(str, "^[-\\+]?\\d+(\\.\\d+)?$");
    }


    /**
     * 匹配数值类型，包括整数和浮点数
     *
     * @param str
     */
    public static boolean isNumeric(String str) {
        return isFloat(str) || isDigits(str);
    }

    /**
     * 匹配URL地址
     *
     * @param str
     */
    public static boolean isUrl(String str) {
        return matches(str, "^http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w-./?%&=]*)?$");
    }

    /**
     * 最小
     *
     * @param min
     * @param value
     */
    public static boolean min(int min, int value) {
        return value >= min;
    }

    /**
     * 最大
     *
     * @param max
     * @param value
     */
    public static boolean max(int max, int value) {
        return value <= max;
    }

    /**
     * 大小范围
     *
     * @param min
     * @param max
     * @param value
     */
    public static boolean range(int min, int max, int value) {
        return min(min, value) && max(max, value);
    }

    /**
     * 是否大于等于最小长度
     *
     * @param min
     * @param str
     */
    public static boolean minLength(int min, String str) {
        if (Objects.isNull(str)) {
            return false;
        }
        return min(min, str.length());
    }

    /**
     * 是否小于等于最大长度
     *
     * @param max
     * @param str
     */
    public static boolean maxLength(int max, String str) {
        if (Objects.isNull(str)) {
            return false;
        }
        return max(max, str.length());
    }

    /**
     * 长度范围
     *
     * @param min 最小
     * @param max 最大
     * @param str 字符串
     */
    public static boolean rangeLength(int min, int max, String str) {
        return minLength(min, str) && maxLength(max, str);
    }

    /**
     * 手机号校验
     * 移动号段: 134,135,136,137,138,139,147,150,151,152,157,158,159,170,178,182,183,184,187,188
     * 联通号段: 130,131,132,145,155,156,170,171,175,176,185,186
     * 电信号段: 133,149,153,170,173,177,180,181,189
     *
     * @param text
     */
    public static boolean isMobile(String text) {
        if (StringHelper.isBlank(text) || text.length() != 11) {
            return false;
        }
        return matches(text, "^((13[0-9])|(14[5,7,9])|(15[^4])|(18[0-9])|(17[0,1,3,5,6,7,8]))\\d{8}$");
    }
    //邮箱

    /**
     * 匹配Email地址
     *
     * @param str
     */
    public static boolean isEmail(String str) {
        return matches(str, "^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$");
    }

    /**
     * 验证银行卡
     * 15-19位数字
     *
     * @param text
     */
    public static boolean isBankCardNo(String text) {
        if (!isDigits(text)) {
            return false;
        }
        return range(15, 19, text.length());
    }

    /**
     * 身份证号码验证
     *
     * @param text
     */
    public static boolean isIdCardNo(String text) {
        return IDCardHelper.isIDCard(text);
    }
}
